/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.TipoBanco;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Banco;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.servico.BancoServico;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.util.Msg;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarCliente {

    @EJB
    PessoaServico clienteServico;
    @EJB
    BancoServico bancoServico;
    private Pessoa cliente;
    private Pessoa clienteEditar;
    private Pessoa clienteVisualizar;
    private Pessoa clienteDelete;
    private List<Pessoa> clientes;
    private Banco banco;
    private Banco bancoEditar;
    private Banco bancoDelete;
    private List<Banco> bancosEditar;
    private List<Banco> bancosVisualizar;
    private String eCliente;
    private String vCliente;
    private static final String msgFailure = ":: Erro de validação: o valor é necessário.";

    @PostConstruct
    public void init() {
        cliente = new Pessoa();
        cliente.setTipoDocumento(TipoDocumento.CPF);
        banco = new Banco();
        clientes = new ArrayList<Pessoa>();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eCliente = params.get("eCliente");
        vCliente = params.get("vCliente");
        paramPost();
    }

    public void paramPost() {
        try {
            if (eCliente != null) {
                clienteEditar = clienteServico.pesquisar(Long.parseLong(eCliente));
                if (clienteEditar.getBancos() == null || clienteEditar.getBancos().isEmpty()) {
                    clienteEditar.setBancos(new ArrayList<Banco>());
                }
                bancoEditar = new Banco();
            }
            if (vCliente != null) {
                clienteVisualizar = clienteServico.pesquisar(Long.parseLong(vCliente));
                bancosVisualizar = clienteVisualizar.getBancos();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void pesquisar() {
        try {
            clientes = clienteServico.find(cliente, banco);
        } catch (Exception e) {
        }
    }

    public void atualizar() {
        try {
            if (clienteEditar.getCpf() != null && !clienteEditar.getCpf().equals("")) {
                if (clienteEditar.getBancos().isEmpty()) {
                    clienteEditar.setBancos(null);
                }
                clienteServico.atualizar(clienteEditar);
                Msg.messagemInfoRedirect(Msg.SuccessFull, "visualizarcliente.xhtml?vCliente=" + clienteEditar.getId());
            } else {
                Msg.messagemError(cliente.getTipoDocumento().getNome().concat(" é obrigatório !"));
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<SelectItem> getTipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public List<SelectItem> getTipoBanco() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoBanco tipo : TipoBanco.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public void existeCliente() {
        Pessoa p = clienteServico.existProprietario(clienteEditar);

        if (p != null) {
            clienteEditar = p;
        } else {
            TipoDocumento documento = cliente.getTipoDocumento();
            cliente = new Pessoa();
            cliente.setTipoDocumento(documento);
        }
    }

    public boolean isPessoaFisica() {
        return cliente.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public boolean isPessoaFisicaEditar() {
        return clienteEditar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public boolean isPessoaFisicaVisualizar() {
        return clienteVisualizar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    public void adicionarBanco() {
        if (bancoValido()) {
            if (!clienteEditar.getBancos().contains(bancoEditar)) {
                clienteEditar.getBancos().add(bancoEditar);
            }
            bancoEditar = new Banco();
        } else {
            RequestContext.getCurrentInstance().execute("required(true)");
        }
    }

    private boolean bancoValido() {

        if (bancoEditar.getTipoBanco() == null && bancoEditar.getTipoBanco() == null) {
            Msg.messagemError("Tipo Banco".concat(msgFailure));
        }
        if (bancoEditar.getTipoBanco() == null && bancoEditar.getTipoBanco() == null) {
            Msg.messagemError("Agência".concat(msgFailure));
        }
        if (bancoEditar.getTipoBanco() == null && bancoEditar.getTipoBanco() == null) {
            Msg.messagemError("Conta".concat(msgFailure));
        }

        if ((bancoEditar.getTipoBanco() == null && bancoEditar.getTipoBanco() == null)
                || (bancoEditar.getTipoBanco() == null && bancoEditar.getTipoBanco() == null)
                || (bancoEditar.getTipoBanco() == null && bancoEditar.getTipoBanco() == null)) {
            return false;
        }

        return true;
    }

    public void editarBanco(Banco b) {
        clienteEditar.getBancos().remove(b);
        bancoEditar = b;
    }

    public void removerBanco() {
        clienteEditar.getBancos().remove(bancoDelete);
    }

    public void deletar() {
        clientes.remove(clienteDelete);
        clienteServico.remover(clienteDelete);
    }

    public Pessoa getCliente() {
        return cliente;
    }

    public void setCliente(Pessoa cliente) {
        this.cliente = cliente;
    }

    public Pessoa getClienteEditar() {
        return clienteEditar;
    }

    public void setClienteEditar(Pessoa clienteEditar) {
        this.clienteEditar = clienteEditar;
    }

    public Pessoa getClienteVisualizar() {
        return clienteVisualizar;
    }

    public void setClienteVisualizar(Pessoa clienteVisualizar) {
        this.clienteVisualizar = clienteVisualizar;
    }

    public Pessoa getClienteDelete() {
        return clienteDelete;
    }

    public void setClienteDelete(Pessoa clienteDelete) {
        this.clienteDelete = clienteDelete;
    }

    public List<Pessoa> getClientes() {
        return clientes;
    }

    public void setClientes(List<Pessoa> clientes) {
        this.clientes = clientes;
    }

    public Banco getBanco() {
        return banco;
    }

    public void setBanco(Banco banco) {
        this.banco = banco;
    }

    public Banco getBancoEditar() {
        return bancoEditar;
    }

    public void setBancoEditar(Banco bancoEditar) {
        this.bancoEditar = bancoEditar;
    }

    public List<Banco> getBancosEditar() {
        return bancosEditar;
    }

    public void setBancosEditar(List<Banco> bancosEditar) {
        this.bancosEditar = bancosEditar;
    }

    public List<Banco> getBancosVisualizar() {
        return bancosVisualizar;
    }

    public void setBancosVisualizar(List<Banco> bancosVisualizar) {
        this.bancosVisualizar = bancosVisualizar;
    }

    public Banco getBancoDelete() {
        return bancoDelete;
    }

    public void setBancoDelete(Banco bancoDelete) {
        this.bancoDelete = bancoDelete;
    }
}
